# 字典的定义
# 字典和集合一样不允许有重复值  (一个键值对 左面的值不允许重复)  左面的键 是密钥(key),密钥是不可以重复的. 右面是值(values)
成绩字典 = {"小明": 43, "小明": 23, '明明': 44, '张亚': 57}   # 元素都是用 , 号隔开的,这里字典是3个元素 :号的是 一个键值对 算一个元素
print(f'成绩字典 的数据是:{成绩字典},类型是{type(成绩字典)}')
空字典1 = {}    # 空字典
空字典2 = dict()
print(f'空字典1 的数据是:{空字典1},类型是{type(空字典1)}')
print(f'空字典2 的数据是:{空字典2},类型是{type(空字典2)}')

# 读取字典数据
# 字典和集合一样不能用下标索引
成绩字典 = {"小明": 23, '明明': 44, '张亚': 57}
分数 = 成绩字典["张亚"]  # 靠 键值对 左边的可以对应右边值
print(f'考试分数是:{分数}')

# 字典也可以嵌套
成绩字典 = {
        '小明': {'语文': 55, '数学': 44, '英语': 33},
        '明明': {'语文': 57, '数学': 84, "英语": 35},
        '张亚': {'语文': 68, '数学': 34, "英语": 38}
        }
print(f'成绩字典 里的数据是:{成绩字典}')
张亚字典 = 成绩字典["张亚"]
print(f'"张亚"的总成绩:{张亚字典}')
# print(f'"张亚"的成绩:{成绩字典["张亚"]}')
分数 = 成绩字典["张亚"]['语文']  # 张亚 语文的成绩
print(f'语文考试分数是:{分数}')
print()

# 添加字典元素
身高字典 = {"小明": 167, '明明': 144, '张亚': 187}
身高字典["丫头"] = 173  # 添加一个新元素进字典
print(f'添加了"丫头"新元素的字典: {身高字典}')

# 修改字典元素里的值
身高字典["小明"] = 201  # 修改 小明 身高为201
print(f'修改"小明"数据以后的字典: {身高字典}')

"""
这里可以看出,添加和修改字典元素的语法操作是一样
键值对 左边是 密钥 ,右边的是 内容
密钥不能修改 不能重复,而且不能索引(因为没有下标号)
所以如果是 新密钥 相当于添加一个新元素(键值对), 如果键入的密钥和字典里的密钥重复了,相当于修改密钥相对于的内容
"""
# 查看字典里,一个密钥是否存在
print('\n查看字典里,"小明"密钥是否存在')
print('小明' in 身高字典, '\n')  # 用 in 关键字查看,存在 True,不存在 False


# 删除字典元素
接受数据 = 身高字典.pop("小明")  # 删除 小明 这个键值对,可以接收密钥的内容,也可以不接收
print(f'删除"小明"数据以后的字典: {身高字典}')
print(f'接收"小明"密钥的数据是:{接受数据}')

# 清空字典元素
身高字典.clear()  # 清空字典
print(f'清空 身高字典 以后的字典数据: {身高字典}')
print()

# 获取字典里全部的 key密钥
身高字典 = {"小明": 167, '明明': 144, '张亚': 187}
key = 身高字典.keys()   # 获取这个里全部的密钥
print(f'字典全部的密钥信息是:{key},数据类型是:{type(key)}')

# 统计字典里元素的数量
数量 = len(身高字典)
print(f'身高字典里有元素个数:{数量}')

# 循环遍历字典
for key in 身高字典:  #.keys():   2种写法都可以
    内容 = 身高字典[key]
    print(f'身高字典里的 密钥和对应内容 是: {key}:{内容}')
print()
print("小练习,员工信息升职加薪")
# 小练习,员工信息升职加薪
员工信息字典 = {
              '张岩': {'部门': '营销部', '工资': 1000, '级别': 1},
              '安道化': {'部门': '后勤部', '工资': 1000, '级别': 1},
              '小雅': {'部门': '市场部', '工资': 3000, '级别': 3},
              '萌新': {'部门': '人事部', '工资': 1000, '级别': 1},
              '小蜜': {'部门': '秘书部', '工资': 4000, '级别': 4}
            }

print("公司现有员工信息如下:")
for 姓名 in 员工信息字典:
    信息字典 = 员工信息字典[姓名]
    print(f'员工 {姓名}\t信息:{信息字典}')

print("公司决定,等级1的员工加一级,工资增加1000元.\n修改后的员工信息如下:")

# 第一种写法
# for 姓名 in 员工信息字典:
#     信息字典 = 员工信息字典[姓名]  # 把第二层嵌套的字典读取出来  第一密钥对应的是 第二层字典
#     for 分录 in 信息字典:
#         值 = 信息字典[分录]  # 第二层嵌套的字典 密钥对应的内容
#         if 值 == 1:  # 如果级别等于1
#             信息字典["级别"] = 2
#             信息字典["工资"] += 1000
#     print(f'员工 {姓名}\t信息:{信息字典}')

# 第二种写法
for 姓名 in 员工信息字典:
    if 员工信息字典[姓名]['级别'] == 1:  # 直接读取级别值
        员工信息字典[姓名]['级别'] = 2
        员工信息字典[姓名]['工资'] += 1000

# 上面循环已经修改完成,在循环输出下数据
for 姓名 in 员工信息字典:
    信息字典 = 员工信息字典[姓名]
    print(f'员工 {姓名}\t信息:{信息字典}')

print()
print("在次说下嵌套问题")
# 在次说下嵌套问题
嵌套字典 = {
        "密钥1": {"二层嵌套密钥1": 11, "二层嵌套密钥2": 22},
        "密钥2": {"二层嵌套密钥1": 33, "二层嵌套密钥2": 44},
       }
# 可以直接读取二层嵌套里的内容,以此类推三层也可以
值 = 嵌套字典["密钥2"]["二层嵌套密钥2"]
print(f'"密钥2""二层嵌套密钥2" 数据是: {值}\n')

# 也可以直接赋值嵌套字典
字典 = {"密钥1": 222, "密钥2": 444}
print(f'原先的字典密钥:{字典}')
字典["新加密钥3"] = {"二层嵌套密钥1": 444}
print(f'添加新嵌套字典内容:{字典}')

"""
y = {"hh": "22-42-4"}
print(y)
文件对象 = open("D:/销售数据总汇.txt", "a", encoding="utf-8")
文件对象.write(str(y))
"""

"""
字典特性说明:
字典里的密钥(key),名称 除了不能重复.同时必须是不能修改的数据类型
比如,列表就不行 因为可以修改. 但是元组可以,因为是不能修改的数据类型
"""
print()
字典 = {
        ('政委',1): 123,
        ('政委',2): 433,
        ('政委',3): 12443
        }
# 元组作为 密钥是可以的,但是列表就不行
print(字典)

字典 = {
        ['政委',1]: 123,
        ['政委',2]: 433,
        ['政委',3]: 12443
        }
# 元组作为 密钥是可以的,但是列表就不行
print(字典)